package model

import (
	"golang.org/x/crypto/bcrypt"
)

// User 用户模型
// ID: 主键
// Username: 用户名
// Password: 密码（加密存储，不返回前端）
// Email: 邮箱
// CreatedAt/UpdatedAt: 时间戳

type User struct {
	Model
	ID       uint   `json:"id" gorm:"primaryKey;comment:'用户ID'"`                                     // 用户ID
	Username string `json:"username" gorm:"type:varchar(64);uniqueIndex;comment:'用户名'"`              // 用户名，唯一索引，最大64字符
	Password string `json:"password,omitempty" gorm:"type:varchar(255);not null;comment:'密码（加密存储）'"` // 密码（加密存储，omitempty防止泄露）
	Email    string `json:"email,omitempty" gorm:"type:varchar(128);comment:'邮箱'"`                   // 邮箱，最大128字符
	// 可根据需要添加 CreatedAt/UpdatedAt 字段
}

// HashPassword 对用户密码进行加密存储
func (u *User) HashPassword(password string) error {
	hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	if err != nil {
		return err
	}
	u.Password = string(hash)
	return nil
}

// CheckPassword 校验用户密码是否正确
func (u *User) CheckPassword(password string) error {
	return bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))
}

// 登录响应结构
type LoginResponse struct {
	Token string `json:"token"`
	User  *User  `json:"user"`
}
